/*================================================================
*   Copyright (C) 2019 Guangzhou Firefly Ltd. All rights reserved.
*   
*   文件名称：perfect_number.c
*   创 建 者：luhuadong
*   创建日期：2019年10月16日
*   描    述：
*
================================================================*/


#include <stdio.h>
#include <math.h>


/* 判断一个数是否为完全数 */
static int is_perfect_number(unsigned int num)
{
	int i, sum=1;

#if 1
	/* 利用真因子关于根号对称出现的特点，范围缩小到sqrt(num) */
	for(i=2; i<=sqrt(num); i++) {
	
		if(num % i == 0) {
		
			sum += i;
			sum += num/i;
		}
	}
#else
	for(i=2; i<=num/2; i++) {
	
		if(num % i == 0) {
		
			sum += i;
		}
	}
#endif

	if(sum == num && num != 1)
		return num;
	else
		return 0;
}


/* 计算n以内的完全数的个数 */
static int count(int n)
{
	int i, cnt=0;

	if(n <= 0 || n > 500000)
		return -1;

	for(i=1; i<=n; i++) {
	
		if(is_perfect_number(i)) {

			printf("%d\n", i);
			cnt++;
		}
	}

	return cnt;
}


int main(void)
{
	int n=0, cnt=0;

	printf(">> ");
	scanf("%d", &n);

	if(-1 == (cnt = count(n))) 
		printf("异常\n");
	else
		printf("Total perfect number between 1 and %d: %d\n", n, cnt);

	return 0;
}
